package lvm.fonctions.prim.subr;

import lvm.Contexte;
import lvm.LvmException;
import lvm.fonctions.prim.Primitive;
import lvm.fonctions.prim.fsubr.Quote;
import lvm.struct.*;

public class Atom extends Subr {
	public static final Atom ATOM = new Atom();
	
	public Atom() {
		super("atom");
	}

	/**
	 * Teste si une Sexpr est un atome (symbole ou Nil)
	 * @param arg: la Sexpr à tester
	 * @return t si arg est un atome, Nil sinon
	 */
	public Sexpr exec(Sexpr arg) throws LvmException {
		// On sélectionne l'unique paramètre de la fonction
		arg = arg.getCar();
		
		//On évalue l'argument selon la présence de la quote
		if (arg instanceof Liste && arg.getCar() instanceof Symbole && Contexte.getContexteCourant().getPrimitive((Symbole)arg.getCar()) instanceof Quote)
			arg = arg.getCdr();
		else
			arg = arg.eval();	
		
		if (arg instanceof Atome)
			return new Symbole("t");
		return Nil.NIL;
	}

}
